iT邦幫忙

2026 iThome 鐵人賽

DAY 18
0
Vibe Coding

看得懂、叫得出、驗得過:30 天 VibeCoding UI 元件實戰系列 第 27 篇

Day 27|Table 不是 Data Table:功能越多,不代表資料越好用

  • 分享至 

  • xImage
  •  

安安~我是ChiYu~

取消「進行中」Filter Chip 後,成員資料從 8 筆回到 24 筆。24 筆本身不會自動把 Table 升級;真正把需求往 Data Table 推的,是管理員接著要搜尋、篩選、多筆選取,再批次停用帳號。

於是,一句很有氣勢的 Prompt 差點就能直接收工:

幫我做一個功能完整的企業級 Data Table。

下面是依照第一版需求重建的錯誤現場。畫面使用虛構成員資料,不含真實個資:

一句企業級 Data Table 讓成員管理同時出現大量搜尋、篩選、欄位與分頁控制

圖 1:實際任務只有選取兩位離職成員並停用帳號,第一版卻把十一個工具列控制項、可排序表頭、列選單與分頁一起開滿。

「企業級」三個字交給 AI,效果通常很穩定。搜尋、排序、篩選、分頁、核取方塊、固定表頭、欄位拖曳、每列三點選單會陸續報到,儲存格最好還能直接編輯。功能像吃到飽一樣擺滿,至於使用者有沒有要吃,等等再說。

問題是,表格每多一項能力,就多一份狀態、鍵盤、跨頁與手機版規則。使用者若只想讀一份三欄費用報表,端上 Grid 等級的互動,不會讓資料更專業,只會讓閱讀先背一套操作手冊。

今天反過來做:從只能讀與比較的 Table 開始。每增加一項能力,都要回答兩題:

  1. 它正在解決哪個真實任務?
  2. 它新增了哪些狀態與失敗路徑?

答不出來,功能就先留在門外。

完整 Demo 與選型階梯整理在 Vibe UI Atlas 的表格比較頁。

先把「企業級」拆成任務與成本

LumenDesk 的管理員需要搜尋姓名、依狀態篩選、調整排序,還要勾選多位成員後停用帳號。這些任務已經超過靜態 Table,但仍然沒有欄位拖曳、任意儲存格編輯或父子階層的需求。

我先替功能記一筆帳:

新增能力 它解決的任務 同時新增的規格
排序 依姓名、日期或狀態重新排列 目前欄位、方向、空值與同值規則
篩選 只看符合條件的資料 已套用條件、AND/OR、零結果與清除方式
多列選取 對多位成員執行同一操作 跨頁保留、全選範圍、取消與部分失敗
分頁 管理大量結果的閱讀範圍 總筆數、每頁筆數、網址、切頁焦點與條件保留
列操作 處理單一成員 操作對象、權限、危險確認與完成回饋
儲存檢視 讓使用者回到相同欄位與條件 偏好保存、版本變更與還原預設

這張表是今天的煞車。AI 加一個按鈕很快,但按鈕背後的查詢狀態、選取範圍與錯誤恢復不會因此自動完成。

四層表格能力:閱讀、管理、儲存格操作與父子階層

先把常見名稱放回能力階梯:

只需要讀與比較列欄資料
→ Table

需要搜尋、排序、篩選、選取、分頁或列操作
→ Data Table,只加入有明確任務的功能

需要方向鍵在儲存格間移動、選取或編輯
→ Grid

同時有父子階層與多欄互動資料
→ Treegrid

Bulk Action Toolbar、Pagination 與 Overflow Menu 是 Data Table 可能需要的配套,不是更高級的表格類型。每加一個,就多一條顯示條件、狀態更新或鍵盤路徑要驗收。

Table:只需要讀與比較,就別先叫每個儲存格上班

Table 適合有明確列與欄關係的資料,例如部門、月份與費用。使用者能由上往下比較同一欄,也能由左往右理解一筆資料。

Table:固定欄位讓讀者比較三筆費用

圖 2:三筆費用以固定列欄呈現,表格本體維持閱讀用途,排序由明確按鈕處理。

這個畫面裡,欄標題、列標題、Caption 與金額格式比陰影和斑馬紋更重要。儲存格不用為了看起來厲害就全部取得焦點,讀者也不需要先學方向鍵才能找到一個數字。

W3C 的 Table Pattern明確區分 Table 與 Grid:Table 是靜態表格式結構,儲存格本身不需要可聚焦或可選取。能用原生 HTML Table 表達關係時,我會先保留 <table>、<th>、scope 與 <caption> 的語意,不急著用 ARIA 重新組裝一次。

表格很寬時,也不要立刻把所有欄位藏掉。先確認主要比較欄位,再決定局部水平捲動、摘要版面或詳細頁。手機版的目標不是「看不到捲軸」,而是主要任務真的能完成。

查看 Table 元件頁

Data Table:功能不是裝飾,而是一套共享狀態

Data Table 不是原生 HTML 元件名稱。它是產品與 Design System 常用的組合,在 Table 上加入搜尋、排序、篩選、選取、分頁與列操作。

Data Table:成員資料可被選取並進入批次操作

圖 3:成員 Data Table 支援搜尋、篩選、選取與批次操作;留下的能力都有對應管理任務。

LumenDesk 會保留姓名搜尋、狀態篩選、排序、多列選取和分頁,因為管理員真的會用到。欄位拖曳沒有對應任務,就不會因為「企業級」先塞進來;使用者從不調欄寬時,那套拖曳、保存與還原規則只是在替未發生的問題加班。

這些功能也不是各自活在一座小島。它們共用至少四組狀態:

狀態 內容 常見錯誤
查詢狀態 關鍵字、篩選、排序、頁碼、每頁筆數 改篩選後仍停在不存在的第 8 頁
結果狀態 Loading、資料、Empty、Error、總筆數 頁碼更新了,資料仍是上一頁
選取狀態 已選 ID、全選範圍、不可操作項目 畫面說選 2 筆,後端收到 24 筆
寫入狀態 確認、處理中、部分成功、失敗與重試 批次停用失敗後,所有列仍顯示成功

只要搜尋、篩選、分頁與選取各自保存一份世界觀,使用者很快就會遇到「畫面說一套、實際操作另一套」的版本。

Client-side 還是 Server-side,不能只看資料量

24 筆資料可以在前端完成搜尋與排序,但正式產品可能有 24,000 筆。這時要先決定查詢在哪裡執行:

  • Client-side: 全部資料已安全載入前端,再由瀏覽器篩選與排序。
  • Server-side: 關鍵字、篩選、排序與頁碼送到後端,後端回傳目前範圍與總筆數。

Server-side Data Table 還要處理請求競態。使用者快速輸入 O、Or、Orbit 時,較舊的 O 查詢可能最後才回來;若前端照單全收,畫面會被舊結果蓋回去。可以取消舊請求、使用 Request ID,或只接受目前查詢版本的回應。

搜尋延遲、快取與 URL Query 也要一起決定。這些不會畫在漂亮截圖裡,卻直接影響資料是否可信。

查看 Data Table 元件頁

Bulk Action Toolbar:先說清楚「全選」到底選了誰

Bulk Action Toolbar 是 Data Table 的批次操作配套。尚未選取資料時,它沒有操作對象,不必全年無休佔在表格上方;選取一筆以上後,再顯示數量、可用操作與取消選取。

Bulk Action Toolbar:選取兩位成員後才出現批次停用

圖 4:選取林子安與陳可欣後,工具列顯示「2 位成員已選取」與批次停用操作。

最麻煩的通常是「全選」。到底只選本頁 20 筆,還是符合篩選的 2,430 筆?兩者差了 2,410 個帳號,後面的確認 Dialog 再漂亮也補不回這行沒寫清楚的規則。

LumenDesk 這次明確採用「只選目前頁」;若產品提供「選取全部篩選結果」,畫面要先顯示本頁數量,再提供第二步擴大範圍,例如:

已選取本頁 20 位成員。選取符合條件的全部 2,430 位?

批次操作完成後,也不能只回一個總成功 Toast。若 20 筆裡有 2 筆因權限或資料版本失敗,畫面要列出成功、失敗與可重試對象,並保留失敗列的選取。全部塗成成功,只是把例外藏進統計數字裡。

查看 Bulk Action Toolbar 元件頁

Pagination:頁碼、條件、網址與焦點要說同一件事

Pagination 把長資料集拆成多頁,適合需要知道目前位置、回到某一頁,或保留穩定結果範圍的工作。

Pagination:目前頁、前後頁與資料範圍一起說明

圖 5:分頁控制顯示目前位置、可前往頁面與資料範圍,讓切頁結果可以被確認。

需求至少要定義:

  • 總筆數與每頁筆數。
  • 改變篩選或每頁筆數後,頁碼如何重設。
  • 查詢條件是否寫入 URL,重新整理與返回能否恢復。
  • 切頁後焦點落在哪裡,新的結果範圍如何被察覺。
  • 資料刪除後,本頁變空時要回上一頁還是顯示 Empty State。

LumenDesk 切頁後把焦點移到資料表標題,因為管理員要重新確認結果範圍;其他流程也可能保留焦點在分頁按鈕,再用 Status Message 宣告新資料。重點不是背一個固定落點,而是切頁後不能讓使用者失去位置。

資料若持續更新、使用者只需要一路瀏覽,Load More 或 Infinite Scroll 可能更自然;它們同樣要處理瀏覽器返回位置、頁尾可達性、載入失敗與可分享網址。換一種捲動方式,規格不會跟著蒸發。

查看 Pagination 元件頁

Overflow Menu:三點選單收次要操作,不是功能倉庫

每列右側的三點選單適合收納低頻或次要操作,例如複製連結、封存與停用。高頻主要操作不該只因為版面擠,就全部被塞進三個點裡。

Overflow Menu:列操作仍要保留對象與危險層級

圖 6:Overflow Menu 收納單列次要操作,危險動作保留名稱、對象與後續確認。

三點按鈕要有完整名稱,例如「林子安的更多操作」。打開後,選單項目不能只寫「刪除」,而應說出「停用林子安帳號」或在後續 Confirmation Dialog 明確顯示對象。完成、取消或關閉後,焦點也要回到原列入口。

資料重新排序或分頁後,焦點返回不能只靠陣列位置。若原本第 3 列已移動,系統應依穩定 ID 找回對象;對象已被刪除時,再移到下一個合理位置並說明結果。

查看 Overflow Menu 元件頁

Grid:儲存格真的需要操作,才值得換一套方向鍵模型

Grid 適合需要在儲存格間移動、選取或編輯的密集資料,例如排班表、權限矩陣或試算表。它不是在 Table 外面加上 role="grid",就能原地轉職。

Grid:方向鍵在權限矩陣的儲存格間移動

圖 7:Grid 把權限矩陣的儲存格變成可操作位置,使用者透過方向鍵在內部移動。

W3C 的 Grid Pattern說明,Grid 是複合型元件,通常只保留一個 Tab 進入點,再由方向鍵於內部移動。這會改變一般網頁鍵盤閱讀方式,也代表我們必須處理焦點位置、選取、編輯模式與離開方式。

若儲存格可編輯,還要決定 Enter、F2、Escape 與 Tab 的行為;儲存失敗時,焦點不能離開後才偷偷顯示錯誤。如果每個儲存格只顯示文字,原生 Table 往往更穩定。為了少按幾次 Tab,把簡單報表升級成 Grid,省下的按鍵可能還沒有新增的 bug 多。

查看 Grid 元件頁

Treegrid:階層加上多欄互動,複雜度直接疊兩層

Treegrid 同時處理父子階層與多欄資料,適合組織預算、專案工作分解或有子資料列的報表。使用者既要知道自己在哪一層,也要比較欄位與展開收合。

Treegrid:展開父層後查看子項目與各欄資料

圖 8:Treegrid 同時呈現父子層級與多欄資料,列可以展開,欄位仍能互相比較。

W3C 的 Treegrid Pattern定義方向鍵、Home、End 與展開收合等互動。若子節點要從後端載入,還要補上 Loading、Empty、Error、Retry,以及收合後如何取消或保留請求。

若只是想把一列明細藏起來,Expandable Row 比較容易理解;資料只有階層、沒有多欄比較時,Tree View 更直接。LumenDesk 的成員名單兩種條件都不符合,所以停在 Data Table,不往 Treegrid 硬升級。

查看 Treegrid 元件頁

成本階梯:每往上一級,都要多交一份操作規格

Table、Data Table 與 Grid 的功能成本比較

圖 9:資料從閱讀、管理走到儲存格互動與父子階層時,表格能力和操作成本一起增加。

LumenDesk 最後停在 Data Table。留下姓名搜尋、狀態篩選、排序、多列選取、範圍清楚的 Bulk Action Toolbar、Pagination 與 Overflow Menu;欄位拖曳、任意儲存格編輯和 Treegrid 沒有加入。

360px 版面保留成員、狀態與主要操作,其他欄位移進可到達的詳細內容,不是直接從 DOM 和任務裡一起消失。資料若多到需要虛擬化,也要確認螢幕閱讀器、搜尋、列數與焦點不會只看得到目前渲染的幾列;效能優化不能把資料語意一起裁掉。

改寫 Prompt:把「企業級」換成任務、範圍與失敗狀態

請為 LumenDesk 建立成員管理 Data Table,不要預設加入所有進階功能。

- 欄位:成員、部門、狀態;使用正確的表格標題與資料關係。
- 支援搜尋姓名、依狀態篩選、依成員排序與多列選取。請明確定義搜尋與排序在前端或後端執行,並避免舊請求覆蓋新結果。
- 尚未選取時隱藏 Bulk Action Toolbar;選取後顯示數量、取消選取與停用帳號。
- 全選只選目前篩選結果中的本頁資料。若日後支援全部結果,必須另外顯示總範圍並再次確認。
- Pagination 顯示目前 21–40/共 236 筆;切頁後保留篩選與排序,更新 URL Query,並讓使用者知道新的結果範圍。
- 每列 Overflow Menu 包含查看詳細、複製連結、停用帳號;觸發按鈕與危險操作都要包含成員名稱。
- 批次操作提供確認、處理中、部分成功、失敗與重試;不可把部分失敗統一顯示成成功。
- 提供 Loading、Empty、Error、零搜尋結果與權限不足。
- 360px 保留成員、狀態與主要操作;其他欄位進入詳細內容,不得讓整頁水平溢出。

這份 Prompt 沒有禁止 AI 做出好看的表格。它只是先把全選範圍、查詢競態、切頁狀態、危險操作對象與部分失敗釘住,避免外觀看起來完成,資料規則還在自由發揮。

驗收表格:從能讀開始,再確認每一級真的有通過

交付前,我會依序檢查:

  1. 資料是否真的需要列與欄?欄標題、列標題與 Caption 是否正確?
  2. 每個排序、篩選、選取與分頁是否有實際任務?
  3. 查詢狀態、結果、選取範圍與寫入結果是否同步?
  4. 全選究竟選本頁還是全部結果,畫面有沒有說清楚?
  5. 批次操作部分失敗後,哪些列成功、哪些列仍可重試?
  6. 360px 是否重新安排資訊,而不是把桌面表格硬塞進窄畫面?
  7. 若真的使用 Grid 或 Treegrid,方向鍵、焦點、編輯與展開模型是否完整實測?

目前 Data Table 的選取、批次工具列、360px 瀏覽器版面與一般鍵盤路徑已驗證。Grid、Treegrid 的複合鍵盤模型、虛擬化與手機實機仍待複驗,文章就停在這條證據線上,不讓「企業級」三個字替它們補考。

24 筆成員資料能管理了,活動專案裡的媒體又選錯工具

開頭那句「功能完整的企業級 Data Table」最後被拆成一組有任務的能力。LumenDesk 停在 Data Table,沒有為了氣勢升級成 Grid 或 Treegrid。

表格把我帶進一筆活動專案後,詳細頁要放六張場地照片和一段教學影片。我又順手交給 AI:

做一個有圖片輪播和影片的漂亮產品頁。

結果照片每五秒自動切換,標題壓在圖片上,旁邊還擺了一支影片。

六張場地照自動輪播,卻缺少暫停控制與可靠的媒體替代路徑

圖 10:六張場地照被塞進自動輪播,但沒有暫停控制;圖片失敗只剩「活動圖片」,關閉 Lightbox 後焦點還回到頁首。

圖片是在提供資訊、供人挑選、輪流展示,還是放大檢視?問題一換,元件也會跟著換。明天就來拆 Image、Thumbnail、Gallery、Carousel、Lightbox、Video Player 與 Aspect Ratio。

參考來源

資料查閱:2026-08-07。


上一篇
Day 26|小型標記怎麼分工?Badge、Tag、Chip、Filter Chip、Status 與 Avatar
系列文
看得懂、叫得出、驗得過:30 天 VibeCoding UI 元件實戰 共 27 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言